La friction fondamentale en physique computationnelle provient du fait que les ordinateurs représentent les nombres réels à l'aide de mathématiques à virgule flottante binaire. Contrairement à la pensée humaine en base 10 (décimale), le matériel stocke les valeurs en base 2 (binaire). Cela entraîne une abstraction fuyante: des fractions décimales simples comme 0,1 ne peuvent pas être représentées de manière précise.
1. La réalité des nombres flottants
Go fournit deux types principaux pour les nombres réels : float32 et float64. Lorsqu'on utilise la syntaxe de déclaration de variable courte comme prix := 0.0, Go utilise par défaut float64. Ces types sont des approximations de la réalité, et non des valeurs mathématiques exactes.
2. Le mystère de 0,1
En base 10, $1/3$ donne un décimal infini répétitif ($0,333...$). En base 2, la valeur $0,1$ donne un fraction infinie répétitive. Comme la mémoire de l'ordinateur est finie, cette fraction est tronquée, ce qui entraîne des erreurs cumulatives. Par exemple, $0,1 + 0,2$ donne $0,30000000000000004$ au lieu de $0,3$ exactement.
Attention : N'utilisez jamais == pour comparer des nombres flottants dans des portes logiques, car ces microscopiques différences feront échouer les comparaisons.